package config;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnJava;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.system.JavaVersion;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/*
 * @SpringBootApplication注解用于指示一个配置类，该类声明一个或多个@Bean方法，并且还触发自动配置和组件扫描
 * 这是一个方便注解，等效于声明@Configuration，@EnableAutoConfiguration和@ComponentScan
 */
@SpringBootApplication
/*
 * @SpringBootConfiguration是用于spring boot项目配置类的注解
 * 在spring boot项目中推荐使用它替代@Configuration注解，
 * 前者是后者的超集
 */
@SpringBootConfiguration
/*
 * 启用自动配置，@EnableAutoConfiguration将根据项目依赖的包自动配置依赖项
 * 可以指定单个或批量指定不自动配置的项目
 */
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
// 根据应用程序运行的虚拟机版本进行匹配
@ConditionalOnJava(value = JavaVersion.ELEVEN)
@Controller
public class SpringBootConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        WebMvcConfigurer.super.addInterceptors(registry);
        HandlerInterceptor interceptor = new HandlerInterceptor() {
            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                    Exception ex) throws Exception {
                System.out.println("在请求映射确认要调用的处理器后，以及在处理器适配器调用处理器之前执行拦截");
            }
        };
        registry.addInterceptor(interceptor).addPathPatterns("/**");
    }

    @RequestMapping("/welcome")
    @ResponseBody
    public String method(HttpServletRequest request) {
        System.out.println("请求的上下文路径：" + request.getContextPath());
        System.out.println("请求的servlet路径：" + request.getServletPath());
        return "你好";
    }
    
    /*
     * 配置自定义的ISO-8859-1消息转换器（不支持中文字符），
     * 如果没有配置自定义消息转换器，那么
     * spring boot将自动配置默认的UTF-8消息转换器
     */
//    @Bean
//    public StringHttpMessageConverter messageConverter() {
//        StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("ISO-8859-1"));
//        return converter;
//    }

    public static void main(String[] args) {
        // 以SpringApplication类的静态方法运行项目
        // SpringApplication.run(SpringBootConfig.class, args);
        SpringApplication app = new SpringApplication(SpringBootConfig.class);
        // 设置关闭banner
        // app.setBannerMode(Mode.OFF);
        app.run(args);
    }
}
